package helloworld;

import java.util.Date;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/*
 * 1.建立数据库:导入create_helloworld.sql到数据库中 
 * 2.实体对象: User.java类 entity
 * 3.关系影射配置:User.hbm.xml
 * 4.数据库基本配置:hibernate.cfg.xml
 * 5.实现并运行本测试程序
 */
public class HelloWorld extends TestCase {

	public void testCreateAndLoad() {
		/*
		 * 初始化hibernate使用环境
		 * 创建Hibernate配置管理类，加载Hibernate本目录下的配置文件hibernate.cfg.xml
		 * 创建SessionFactory
		 */
		Configuration config = new Configuration()
				.configure("helloworld/hibernate.cfg.xml");
		SessionFactory sessionFactory = config.buildSessionFactory();

		/*
		 * 创建实体对象
		 */
		User user = new User("agate", new Date());
		assertNull("id做为主键不用我们设置", user.getId());

		/*
		 * 持久化用户对象
		 */
		// 第1次打开数据库，存入一个User
		Session session = sessionFactory.openSession();
		// 存储一个对象核心是：Session#save(Object o)方法,但一定要包裹在一个事务中．
		Transaction t = session.beginTransaction();// 启动一个事务

		Integer id = (Integer) session.save(user);// 存储对象的核心语句

		assertNotNull("id被作为主键save后自动设置", user.getId());
		assertEquals("session.save返回值就是对象的主键", id, user.getId());

		t.commit();// 提交事务
		session.close();

		/*
		 * 取出对象
		 */
		// 再2次打开数据库，取出刚才存入的User
		session = sessionFactory.openSession();
		User loaded = (User) session.load(User.class, id);
		assertEquals("agate", loaded.getName());
		session.close();

		sessionFactory.close();
	}

}
